// C++模板实例化的类型：部分实例化、完全实例化
// C++模板系统中的实例化过程有几种不同的形式，理解它们的区别对于掌握模板编程非常重要。

// 部分实例化 (Partial Instantiation)
// 部分实例化是指只替换部分模板参数，但保留其他参数作为模板参数的过程。
// 1.部分替换参数：只有部分模板参数被具体类型替换
// 2.结果仍是模板：部分实例化的结果仍然是一个模板，不是具体类型
// 3.通常用于特化：常见于部分特化的场景

// 原始模板
template <typename T, typename U>
class Container
{
    // 通用实现
};

// 部分实例化：固定第一个参数为int，第二个参数仍是模板参数
template <typename U>
class Container<int, U>
{
    // 针对int的特殊实现
};

// 使用部分实例化的模板
Container<int, double> obj; // 使用部分特化版本
// 在这个例子中，Container<int, U>是Container<T, U>的部分实例化。

// 完全实例化 (Complete Instantiation)
// 完全实例化是指所有模板参数都被具体类型替换，生成完整的非模板代码的过程。
// 1.全部替换参数：所有模板参数都被具体类型替换
// 2.结果是具体类型：完全实例化的结果是一个具体的类或函数，不再是模板
// 3.生成机器代码：编译器为完全实例化的模板生成实际的机器代码
template <typename T>
T max(T a, T b)
{
    return a > b ? a : b;
}

// 完全实例化
int result = max(10, 20); // 实例化max<int>
